package com.project.restaurant.common.api;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.util.List;

/**
 * 通用响应对象
 */
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class ResponseResult<T> {
    private int code;
    private String message;
    private T data;
    
    public ResponseResult(StateCode code){
        this.code = code.getCode();
        this.message = code.getMessage();
        this.data = null;
    }
    protected ResponseResult(StateCode code, T data) {
        this.code = code.getCode();
        this.message = code.getMessage();
        this.data = data;
    }

    /**
     * 业务成功处理，则返回一个成功结果对象
     * @param data 要响应的数据
     * @return 返回一个响应结果对象
     */
    public static <T> ResponseResult<T> success(T data){
        return new ResponseResult<>(ServiceStateCode.SUCCESS, data);
    }

    /**
     * 业务失败处理，则返回一个失败结果对象
     * @param code 失败的状态码
     * @return 返回一个响应结果对象
     */
    public static <T> ResponseResult<T> failure(StateCode code){
        return new ResponseResult<>(code);
    }

    /**
     * 根据多个业务的处理状态码，自动判断是否所有业务成功处理，
     * 如果是，则返回一个多个业务成功处理完成的结果对象
     * @param code 业务处理的状态码集合
     * @param data 要响应的数据
     * @return 返回一个响应结果对象
     */
    public static <T> ResponseResult<T> auto(List<StateCode> code, T data){
        for(StateCode state:code){
            if(!ServiceStateCode.SUCCESS.equals(state)){
                if(data instanceof Boolean){
                    return (ResponseResult<T>) booleanResp(state, (Boolean) data);
                }
                return failure(state);
            }
        }
        return success(data);
    }

    /**
     * 根据业务处理的状态码，自动判断是否业务成功处理，
     * 如果是，则返回回一个成功结果对象
     * 否则
     * @param code
     * @param data
     * @return
     */
    public static <T> ResponseResult<T> auto(StateCode code,T data){
        if(ServiceStateCode.SUCCESS.equals(code)){
            return success(data);
        }
        if(data instanceof Boolean){
            return (ResponseResult<T>) booleanResp(code, (Boolean) data);
        }
        return failure(code);
    }
    public static ResponseResult<Boolean> booleanResp(StateCode code, Boolean data){
        return new ResponseResult<>(code,data);
    }

    public boolean isSuccess(){
        return code == 200;
    }


}
